home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-9.10-netbook-remix-PL.iso / casper / filesystem.squashfs / usr / share / system-config-printer / troubleshoot / PrintTestPage.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-10-28  |  16KB  |  529 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import cups
  5. import dbus
  6. import dbus.glib as dbus
  7. import gobject
  8. import os
  9. import pango
  10. import tempfile
  11. import time
  12. from timedops import TimedOperation, OperationCanceled
  13. from base import *
  14. import errordialogs
  15. errordialogs.set_gettext_function(_)
  16. from errordialogs import *
  17. DBUS_PATH = '/com/redhat/PrinterSpooler'
  18. DBUS_IFACE = 'com.redhat.PrinterSpooler'
  19.  
  20. class PrintTestPage(Question):
  21.     STATE = {
  22.         cups.IPP_JOB_PENDING: _('Pending'),
  23.         cups.IPP_JOB_HELD: _('Held'),
  24.         cups.IPP_JOB_PROCESSING: _('Processing'),
  25.         cups.IPP_JOB_STOPPED: _('Stopped'),
  26.         cups.IPP_JOB_CANCELED: _('Canceled'),
  27.         cups.IPP_JOB_ABORTED: _('Aborted'),
  28.         cups.IPP_JOB_COMPLETED: _('Completed') }
  29.     
  30.     def __init__(self, troubleshooter):
  31.         Question.__init__(self, troubleshooter, 'Print test page')
  32.         page = gtk.VBox()
  33.         page.set_spacing(12)
  34.         page.set_border_width(12)
  35.         label = gtk.Label()
  36.         label.set_alignment(0, 0)
  37.         label.set_use_markup(True)
  38.         label.set_line_wrap(True)
  39.         page.pack_start(label, False, False, 0)
  40.         self.main_label = label
  41.         self.main_label_text = '<span weight="bold" size="larger">' + _('Test Page') + '</span>\n\n' + _('Now print a test page.  If you are having problems printing a specific document, print that document now and mark the print job below.')
  42.         hbox = gtk.HButtonBox()
  43.         hbox.set_border_width(0)
  44.         hbox.set_spacing(3)
  45.         hbox.set_layout(gtk.BUTTONBOX_START)
  46.         self.print_button = gtk.Button(_('Print Test Page'))
  47.         hbox.pack_start(self.print_button, False, False, 0)
  48.         self.cancel_button = gtk.Button(_('Cancel All Jobs'))
  49.         hbox.pack_start(self.cancel_button, False, False, 0)
  50.         page.pack_start(hbox, False, False, 0)
  51.         tv = gtk.TreeView()
  52.         test_cell = gtk.CellRendererToggle()
  53.         test = gtk.TreeViewColumn(_('Test'), test_cell, active = 0)
  54.         job = gtk.TreeViewColumn(_('Job'), gtk.CellRendererText(), text = 1)
  55.         printer_cell = gtk.CellRendererText()
  56.         printer = gtk.TreeViewColumn(_('Printer'), printer_cell, text = 2)
  57.         name_cell = gtk.CellRendererText()
  58.         name = gtk.TreeViewColumn(_('Document'), name_cell, text = 3)
  59.         status = gtk.TreeViewColumn(_('Status'), gtk.CellRendererText(), text = 4)
  60.         test_cell.set_radio(False)
  61.         self.test_cell = test_cell
  62.         printer.set_resizable(True)
  63.         printer_cell.set_property('ellipsize', pango.ELLIPSIZE_END)
  64.         printer_cell.set_property('width-chars', 20)
  65.         name.set_resizable(True)
  66.         name_cell.set_property('ellipsize', pango.ELLIPSIZE_END)
  67.         name_cell.set_property('width-chars', 20)
  68.         status.set_resizable(True)
  69.         tv.append_column(test)
  70.         tv.append_column(job)
  71.         tv.append_column(printer)
  72.         tv.append_column(name)
  73.         tv.append_column(status)
  74.         tv.set_rules_hint(True)
  75.         sw = gtk.ScrolledWindow()
  76.         sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  77.         sw.set_shadow_type(gtk.SHADOW_IN)
  78.         sw.add(tv)
  79.         self.treeview = tv
  80.         page.pack_start(sw)
  81.         label = gtk.Label(_('Did the marked print jobs print correctly?'))
  82.         label.set_line_wrap(True)
  83.         label.set_alignment(0, 0)
  84.         page.pack_start(label, False, False, 0)
  85.         vbox = gtk.VBox()
  86.         vbox.set_spacing(6)
  87.         self.yes = gtk.RadioButton(label = _('Yes'))
  88.         no = gtk.RadioButton(label = _('No'))
  89.         no.set_group(self.yes)
  90.         vbox.pack_start(self.yes, False, False, 0)
  91.         vbox.pack_start(no, False, False, 0)
  92.         page.pack_start(vbox, False, False, 0)
  93.         self.persistent_answers = { }
  94.         troubleshooter.new_page(page, self)
  95.  
  96.     
  97.     def display(self):
  98.         answers = self.troubleshooter.answers
  99.         if not answers.has_key('cups_queue'):
  100.             return False
  101.         parent = self.troubleshooter.get_window()
  102.         self.authconn = answers['_authenticated_connection']
  103.         mediatype = None
  104.         defaults = answers.get('cups_printer_ppd_defaults', { })
  105.         for opts in defaults.values():
  106.             for opt, value in opts.iteritems():
  107.                 if opt == 'MediaType':
  108.                     mediatype = value
  109.                     break
  110.                     continue
  111.                 answers.has_key('cups_queue')
  112.             
  113.         
  114.         if mediatype != None:
  115.             mediatype_string = '\n\n' + _("Remember to load paper of type '%s' into the printer first.") % mediatype
  116.         else:
  117.             mediatype_string = ''
  118.         label_text = self.main_label_text + mediatype_string
  119.         self.main_label.set_markup(label_text)
  120.         model = gtk.ListStore(gobject.TYPE_BOOLEAN, gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
  121.         self.treeview.set_model(model)
  122.         self.job_to_iter = { }
  123.         test_jobs = self.persistent_answers.get('test_page_job_id', [])
  124.         
  125.         def get_jobs():
  126.             c = self.authconn
  127.             jobs_dict = c.getJobs(which_jobs = 'not-completed', my_jobs = False)
  128.             completed_jobs_dict = c.getJobs(which_jobs = 'completed')
  129.             return (jobs_dict, completed_jobs_dict)
  130.  
  131.         self.op = TimedOperation(get_jobs, parent = parent)
  132.         
  133.         try:
  134.             (jobs_dict, completed_jobs_dict) = self.op.run()
  135.         except OperationCanceled:
  136.             (None,)
  137.             (None,)
  138.             return False
  139.  
  140.         
  141.         try:
  142.             queue_uri_ending = '/' + self.troubleshooter.answers['cups_queue']
  143.             jobs_on_this_printer = ((None,), filter)((lambda x: jobs_dict[x]['job-printer-uri'].endswith(queue_uri_ending)), jobs_dict.keys())
  144.         except:
  145.             (None,)
  146.             jobs_on_this_printer = []
  147.  
  148.         jobs = list(set(test_jobs).union(set(jobs_on_this_printer)))
  149.         completed_jobs_dict = None
  150.         for job in jobs:
  151.             
  152.             try:
  153.                 j = jobs_dict[job]
  154.             except KeyError:
  155.                 (None,)
  156.                 (None,)
  157.                 
  158.                 try:
  159.                     j = completed_jobs_dict[job]
  160.                 except KeyError:
  161.                     continue
  162.                 except:
  163.                     None<EXCEPTION MATCH>KeyError
  164.                 
  165.  
  166.                 None<EXCEPTION MATCH>KeyError
  167.  
  168.             iter = model.append(None)
  169.             self.job_to_iter[job] = iter
  170.             model.set_value(iter, 0, job in test_jobs)
  171.             model.set_value(iter, 1, job)
  172.             self.update_job(job, j)
  173.         
  174.         return True
  175.  
  176.     
  177.     def connect_signals(self, handler):
  178.         self.print_sigid = self.print_button.connect('clicked', self.print_clicked)
  179.         self.cancel_sigid = self.cancel_button.connect('clicked', self.cancel_clicked)
  180.         self.test_sigid = self.test_cell.connect('toggled', self.test_toggled)
  181.         
  182.         def create_subscription():
  183.             c = self.authconn
  184.             sub_id = c.createSubscription('/', events = [
  185.                 'job-created',
  186.                 'job-completed',
  187.                 'job-stopped',
  188.                 'job-progress',
  189.                 'job-state-changed'])
  190.             return sub_id
  191.  
  192.         parent = self.troubleshooter.get_window()
  193.         self.op = TimedOperation(create_subscription, parent = parent)
  194.         
  195.         try:
  196.             self.sub_id = self.op.run()
  197.         except OperationCanceled:
  198.             (None,)
  199.             (None,)
  200.         except:
  201.             (None,)
  202.  
  203.         
  204.         try:
  205.             bus = dbus.SystemBus()
  206.         except:
  207.             (None,)
  208.             bus = None
  209.  
  210.         self.bus = bus
  211.         if bus:
  212.             bus.add_signal_receiver(self.handle_dbus_signal, path = DBUS_PATH, dbus_interface = DBUS_IFACE)
  213.         
  214.         self.timer = gobject.timeout_add(1000, self.update_jobs_list)
  215.  
  216.     
  217.     def disconnect_signals(self):
  218.         if self.bus:
  219.             self.bus.remove_signal_receiver(self.handle_dbus_signal, path = DBUS_PATH, dbus_interface = DBUS_IFACE)
  220.         
  221.         self.print_button.disconnect(self.print_sigid)
  222.         self.cancel_button.disconnect(self.cancel_sigid)
  223.         self.test_cell.disconnect(self.test_sigid)
  224.         
  225.         def cancel_subscription(sub_id):
  226.             c = self.authconn
  227.             c.cancelSubscription(sub_id)
  228.  
  229.         parent = self.troubleshooter.get_window()
  230.         self.op = TimedOperation(cancel_subscription, (self.sub_id,), parent = parent)
  231.         
  232.         try:
  233.             self.op.run()
  234.         except OperationCanceled:
  235.             (None,)
  236.             (None,)
  237.         except:
  238.             (None,)
  239.  
  240.         
  241.         try:
  242.             del self.sub_seq
  243.         except:
  244.             (None,)
  245.  
  246.         gobject.source_remove(self.timer)
  247.  
  248.     
  249.     def collect_answer(self):
  250.         if not self.displayed:
  251.             return { }
  252.         self.answers = self.persistent_answers.copy()
  253.         parent = self.troubleshooter.get_window()
  254.         success = self.yes.get_active()
  255.         self.answers['test_page_successful'] = success
  256.         
  257.         class collect_jobs:
  258.             
  259.             def __init__(self, model):
  260.                 self.jobs = []
  261.                 model.foreach(self.each, None)
  262.  
  263.             
  264.             def each(self, model, path, iter, user_data):
  265.                 self.jobs.append(model.get(iter, 0, 1, 2, 3, 4))
  266.  
  267.  
  268.         model = self.treeview.get_model()
  269.         jobs = collect_jobs(model).jobs
  270.         
  271.         def collect_attributes(jobs):
  272.             job_attrs = None
  273.             c = self.authconn
  274.             with_attrs = []
  275.             for test, jobid, printer, doc, status in jobs:
  276.                 attrs = None
  277.                 if test:
  278.                     
  279.                     try:
  280.                         attrs = c.getJobAttributes(jobid)
  281.                     except AttributeError:
  282.                         if job_attrs == None:
  283.                             job_attrs = c.getJobs(which_jobs = 'all')
  284.                         
  285.                         attrs = self.job_attrs[jobid]
  286.                     except:
  287.                         None<EXCEPTION MATCH>AttributeError
  288.                     
  289.  
  290.                 None<EXCEPTION MATCH>AttributeError
  291.                 with_attrs.append((test, jobid, printer, doc, status, attrs))
  292.             
  293.             return with_attrs
  294.  
  295.         self.op = TimedOperation(collect_attributes, (jobs,), parent = parent)
  296.         
  297.         try:
  298.             with_attrs = self.op.run()
  299.             self.answers['test_page_job_status'] = with_attrs
  300.         except OperationCanceled:
  301.             (self.displayed,)
  302.             (self.displayed,)
  303.         except:
  304.             (self.displayed,)
  305.  
  306.         return self.answers
  307.  
  308.     
  309.     def cancel_operation(self):
  310.         self.op.cancel()
  311.         answers = self.troubleshooter.answers
  312.         factory = answers['_authenticated_connection_factory']
  313.         self.authconn = factory.get_connection()
  314.         self.answers['_authenticated_connection'] = self.authconn
  315.  
  316.     
  317.     def handle_dbus_signal(self, *args):
  318.         debugprint('D-Bus signal caught: updating jobs list soon')
  319.         gobject.source_remove(self.timer)
  320.         self.timer = gobject.timeout_add(200, self.update_jobs_list)
  321.  
  322.     
  323.     def update_job(self, jobid, job_dict):
  324.         iter = self.job_to_iter[jobid]
  325.         model = self.treeview.get_model()
  326.         
  327.         try:
  328.             printer_name = job_dict['printer-name']
  329.         except KeyError:
  330.             
  331.             try:
  332.                 uri = job_dict['job-printer-uri']
  333.                 r = uri.rfind('/')
  334.                 printer_name = uri[r + 1:]
  335.             except KeyError:
  336.                 printer_name = None
  337.             except:
  338.                 None<EXCEPTION MATCH>KeyError
  339.             
  340.  
  341.             None<EXCEPTION MATCH>KeyError
  342.  
  343.         if printer_name != None:
  344.             model.set_value(iter, 2, printer_name)
  345.         
  346.         model.set_value(iter, 3, job_dict['job-name'])
  347.         model.set_value(iter, 4, self.STATE[job_dict['job-state']])
  348.  
  349.     
  350.     def print_clicked(self, widget):
  351.         now = time.time()
  352.         tt = time.localtime(now)
  353.         when = time.strftime('%d/%b/%Y:%T %z', tt)
  354.         self.persistent_answers['test_page_attempted'] = when
  355.         answers = self.troubleshooter.answers
  356.         parent = self.troubleshooter.get_window()
  357.         
  358.         def print_test_page(*args, **kwargs):
  359.             factory = answers['_authenticated_connection_factory']
  360.             c = factory.get_connection()
  361.             return c.printTestPage(*args, **kwargs)
  362.  
  363.         tmpfname = None
  364.         mimetypes = [
  365.             None,
  366.             'text/plain']
  367.         for mimetype in mimetypes:
  368.             
  369.             try:
  370.                 if mimetype == None:
  371.                     self.op = TimedOperation(print_test_page, (answers['cups_queue'],), parent = parent)
  372.                     jobid = self.op.run()
  373.                 elif mimetype == 'text/plain':
  374.                     (tmpfd, tmpfname) = tempfile.mkstemp()
  375.                     os.write(tmpfd, 'This is a test page.\n')
  376.                     os.close(tmpfd)
  377.                     self.op = TimedOperation(print_test_page, (answers['cups_queue'],), kwargs = {
  378.                         'file': tmpfname,
  379.                         'format': mimetype }, parent = parent)
  380.                     jobid = self.op.run()
  381.                     
  382.                     try:
  383.                         os.unlink(tmpfname)
  384.                     except OSError:
  385.                         pass
  386.  
  387.                     tmpfname = None
  388.                 
  389.                 jobs = self.persistent_answers.get('test_page_job_id', [])
  390.                 jobs.append(jobid)
  391.                 self.persistent_answers['test_page_job_id'] = jobs
  392.             continue
  393.             except OperationCanceled:
  394.                 (None,)
  395.                 (None,)
  396.                 self.persistent_answers['test_page_submit_failure'] = 'cancel'
  397.                 break
  398.                 continue
  399.                 except RuntimeError:
  400.                     self.persistent_answers['test_page_submit_failure'] = 'connect'
  401.                     break
  402.                     continue
  403.                     except cups.IPPError:
  404.                         (e, s) = None
  405.                         if e == cups.IPP_DOCUMENT_FORMAT and mimetypes.index(mimetype) < len(mimetypes) - 1:
  406.                             if tmpfname != None:
  407.                                 os.unlink(tmpfname)
  408.                                 tmpfname = None
  409.                                 continue
  410.                             continue
  411.                         
  412.                         self.persistent_answers['test_page_submit_failure'] = (e, s)
  413.                         show_error_dialog(_('Error submitting test page'), _("There was an error during the CUPS operation: '%s'.") % s, self.troubleshooter.get_window())
  414.                         break
  415.                         continue
  416.                     
  417.                 return None
  418.  
  419.  
  420.     
  421.     def cancel_clicked(self, widget):
  422.         self.persistent_answers['test_page_jobs_cancelled'] = True
  423.         jobids = []
  424.         for jobid, iter in self.job_to_iter.iteritems():
  425.             jobids.append(jobid)
  426.         
  427.         
  428.         def cancel_jobs(jobids):
  429.             c = self.authconn
  430.             for jobid in jobids:
  431.                 
  432.                 try:
  433.                     c.cancelJob(jobid)
  434.                 continue
  435.                 except cups.IPPError:
  436.                     (e, s) = None
  437.                     if e != cups.IPP_NOT_POSSIBLE:
  438.                         self.persistent_answers['test_page_cancel_failure'] = (e, s)
  439.                     
  440.                     e != cups.IPP_NOT_POSSIBLE
  441.                 
  442.  
  443.             
  444.  
  445.         self.op = TimedOperation(cancel_jobs, (jobids,), parent = self.troubleshooter.get_window())
  446.         
  447.         try:
  448.             self.op.run()
  449.         except OperationCanceled:
  450.             (None,)
  451.             (None,)
  452.         except:
  453.             (None,)
  454.  
  455.  
  456.     
  457.     def test_toggled(self, cell, path):
  458.         model = self.treeview.get_model()
  459.         iter = model.get_iter(path)
  460.         active = model.get_value(iter, 0)
  461.         model.set_value(iter, 0, not active)
  462.  
  463.     
  464.     def update_jobs_list(self):
  465.         
  466.         def get_notifications(self):
  467.             c = self.authconn
  468.             
  469.             try:
  470.                 notifications = c.getNotifications([
  471.                     self.sub_id], [
  472.                     self.sub_seq + 1])
  473.             except AttributeError:
  474.                 notifications = c.getNotifications([
  475.                     self.sub_id])
  476.  
  477.             return notifications
  478.  
  479.         gtk.gdk.threads_enter()
  480.         parent = self.troubleshooter.get_window()
  481.         self.op = TimedOperation(get_notifications, (self,), parent = parent)
  482.         
  483.         try:
  484.             notifications = self.op.run()
  485.         except OperationCanceled:
  486.             gtk.gdk.threads_leave()
  487.             return True
  488.  
  489.         answers = self.troubleshooter.answers
  490.         model = self.treeview.get_model()
  491.         queue = answers['cups_queue']
  492.         test_jobs = self.persistent_answers.get('test_page_job_id', [])
  493.         for event in notifications['events']:
  494.             seq = event['notify-sequence-number']
  495.             
  496.             try:
  497.                 if seq <= self.sub_seq:
  498.                     continue
  499.             except AttributeError:
  500.                 pass
  501.  
  502.             self.sub_seq = seq
  503.             job = event['notify-job-id']
  504.             nse = event['notify-subscribed-event']
  505.             if nse == 'job-created':
  506.                 if job in test_jobs or event['printer-name'] == queue:
  507.                     iter = model.append(None)
  508.                     self.job_to_iter[job] = iter
  509.                     model.set_value(iter, 0, True)
  510.                     model.set_value(iter, 1, job)
  511.                 
  512.             elif not self.job_to_iter.has_key(job):
  513.                 continue
  514.             
  515.             if job in test_jobs and nse in ('job-stopped', 'job-completed'):
  516.                 comp = self.persistent_answers.get('test_page_completions', [])
  517.                 comp.append((job, event['notify-text']))
  518.                 self.persistent_answers['test_page_completions'] = comp
  519.             
  520.             self.update_job(job, event)
  521.         
  522.         gobject.source_remove(self.timer)
  523.         self.timer = gobject.timeout_add(1000 * notifications['notify-get-interval'], self.update_jobs_list)
  524.         debugprint('Update again in %ds' % notifications['notify-get-interval'])
  525.         gtk.gdk.threads_leave()
  526.         return False
  527.  
  528.  
  529.